package com.demo.apparel.service.uniapp.Impl;

import cn.hutool.json.JSONUtil;
import com.demo.apparel.dto.uniapp.MatchCreateDTO;
import com.demo.apparel.dto.uniapp.MatchPageQueryDTO;
import com.demo.apparel.entity.Match;
import com.demo.apparel.mapper.uniapp.MatchMapper;
import com.demo.apparel.service.uniapp.MatchService;
import com.demo.apparel.vo.PageVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collections;
import java.util.List;
import java.util.UUID;

@Service
public class MatchServiceImpl implements MatchService {

    @Autowired
    private MatchMapper matchMapper;

    /**
     * 创建新的搭配记录
     *
     * @param userId 用户ID
     * @param dto 前端传入的搭配信息 DTO
     * @return 返回创建的搭配 ID
     */
    @Override
    @Transactional
    public String createMatch(String userId, MatchCreateDTO dto) {
        Match match = new Match();

        // 2. 生成唯一ID
        String id = UUID.randomUUID().toString().replace("-", "");
        match.setId(id);
        match.setUserId(userId);
        match.setName(dto.getName());
        match.setDescription(dto.getDescription());
        // 使用 Hutool JSONUtil 转成 JSON 字符串
        match.setImages(JSONUtil.toJsonStr(dto.getImages()));
        match.setTags(JSONUtil.toJsonStr(dto.getTags()));

        matchMapper.insert(match);
        return match.getId();
    }

    /**
     * 根据 ID 查询搭配记录
     *
     * @param id 搭配ID
     * @return 返回 Match 实体对象，如果不存在则返回 null
     */
    @Override
    public Match getMatchById(String id) {
        return matchMapper.selectById(id);
    }

    /**
     * 将 Match 对象中的 tags JSON 字符串解析成 List<String>
     *
     * @param match Match 实体对象
     * @return 返回标签列表，如果 tags 为 null，则返回空列表
     */
    @Override
    public List<String> parseTags(Match match) {
        if (match.getTags() == null) return Collections.emptyList();
        // 用 Hutool JSONUtil 反序列化成 List<String>
        return JSONUtil.toList(match.getTags(), String.class);
    }

    /**
     * 将 Match 对象中的 images JSON 字符串解析成 List<String>
     *
     * @param match Match 实体对象
     * @return 返回图片列表，如果 images 为 null，则返回空列表
     */
    @Override
    public List<String> parseImages(Match match) {
        if (match.getImages() == null) return Collections.emptyList();
        return JSONUtil.toList(match.getImages(), String.class);
    }


    /**
     * 根据用户ID查询该用户所有搭配
     *
     * @param userId 用户ID
     * @return 返回用户所有搭配列表
     */
    @Override
    public List<Match> getMatchesByUserId(String userId) {
        return matchMapper.selectByUserId(userId);
    }


    /**
     * 分页查询用户搭配列表
     *
     * @param userId 用户ID
     * @param query 分页查询参数 DTO（包含 pageNum, pageSize, name）
     * @return 返回分页结果 PageVO，包含 records（当前页数据）、total（总记录数）、pageNum、pageSize
     */
    @Override
    public PageVO<Match> getMatchesPage(String userId, MatchPageQueryDTO query) {
        int offset = (query.getPageNum() - 1) * query.getPageSize();
        int limit = query.getPageSize();

        long total = matchMapper.countByUserIdAndName(userId, query.getName());
        List<Match> records = matchMapper.selectByUserIdAndName(userId, query.getName(), offset, limit);

        return new PageVO<>(records, total, query.getPageNum(), query.getPageSize());
    }

    @Override
    public PageVO<Match> getAllMatchesPage(MatchPageQueryDTO query) {
        int offset = (query.getPageNum() - 1) * query.getPageSize();
        int limit = query.getPageSize();

        long total = matchMapper.countAllMatches(query.getName());
        List<Match> records = matchMapper.selectAllMatches(query.getName(), offset, limit);

        return new PageVO<>(records, total, query.getPageNum(), query.getPageSize());
    }


}
